package com.webserver.core;

import com.webserver.http.HttpServletRequest;
import com.webserver.http.HttpServletResponse;

import java.io.File;
import java.net.URISyntaxException;

/***
 * 该类是MVC框架提供的类，用于接手Tomcat处理交互
 * 处理请求环节的工作第五十六步
 */
public class DispatcherServlet {
    /**
     * 改成单例模式为了不每次都new一个新对象第五十九步
     */
    private static DispatcherServlet instance = new DispatcherServlet();
    private DispatcherServlet() {
    }
    public static DispatcherServlet getInstance(){
        return instance;
    }

    /**
     * 为了不每次都重新找路径定成两个静态属性
     *然后初始化 第五十八步
     */
    private static File root;
    private static File staticDir;
    static {
        try {
            root = new File(DispatcherServlet.class.getClassLoader().getResource(".").toURI()
            );
            staticDir = new File(root,"static");
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

    }

    /**
     * 第五十七步 给处理请求的代码从ClientHandler拿出来封装成方法
     * @param request
     * @param response
     */
    public void service(HttpServletRequest request , HttpServletResponse response){
        //第三十步定位类加载路径
        String path = request.getUri();
        //static路径根据类加载路径找到的

        //根据static找到index (改成根据抽象路径（path）找到地址)
        File file = new File(staticDir,path);
        //定义一个变量用来接收是否是个文件返回的输出语句
        //  String statusLine;
        //第三十九步判断是否是个文件 如果是文件就读取否则返回404
        if (file.isFile()){
            //存在
//                statusLine = "HTTP/1.1 200 OK";
                //发送响应头第六十三步
            response.addHeader("Content-Type","text/html");
            response.addHeader("Content-Length",file.length()+"");
            //第五十一步将发送的状态行改造成方法
            response.setContentFile(file);
        }else {
            //不存在
            //五十二步如果不存在改成404
            response.setStatusCode(404);
            response.setStatusReason("NotFound");
            //回给它一个404页面
            file = new File(staticDir,"404.html");
            response.addHeader("Content-Type","text/html");
            response.addHeader("Content-Length",file.length()+"");
            response.setContentFile(file);
            //statusLine = "HTTP/1.1 404 NotFound";

        }

    }
}
